iT邦幫忙

2024 iThome 鐵人賽

DAY 0
0
自我挑戰組

重新開始 elasticsearch 系列 第 3

2024 鐵人賽 Day4: Start From Demo Code

  • 分享至 

  • xImage
  •  

** 因為 elasticsearch 要打很多字,寫文苦手如我決定縮寫它,所以會用 ES 代稱。*

Kibana Dev Tool

相信在讀這篇文章的你,很大機率會使用過 RDB(relation database),例如 oracle db,MSSQL server,postgresql 等。 在 RDB 內,會用 table 來擺放具有相同欄位的資料,在 ES 內 index 是類似的概念(只是類似,不完全等同)。在一個 Index 內的一筆資料稱為 Document,是以 JSON 的格式貯存的;JSON 內的欄位(fields),可以類比於 RDB 的欄(columns),只是 fields 可以巢狀貯存(field 內還有 field)。

如果相比於 RDB ,你比較熟悉的是 MongoDB 這種 NoSql 資料庫,應該會有很多類似的設計。

在第二天的內容中有提到 elasticsearch 是 RESTful 的,因此接下來跟 es 溝通,都可以使用 API request 執行,但既然 Kibana 都架好了,我們也可以用 kibana 的 Develop Tools 工具來 query ES 的資料。

https://ithelp.ithome.com.tw/upload/images/20240919/20169448KDjGaPRc2Z.png

請點選 Menu Bar 上的漢堡,往下滑動到 Management 區塊,找到 Dev Tool 點入,會看到類似下圖畫面,大致一分為二,左邊有一些預填好的 demo query,右邊是空白的。

https://ithelp.ithome.com.tw/upload/images/20240919/20169448KVDaUXXlCN.png

這個頁面左邊就是可以自由撰寫 query 跟 es 溝通的簡易編輯器,每一個片段都是可以直截選取並執行的,例如你把游標放在第 10 行,在第 10 行的最末,會出現播放鍵三角形 icon 可以點選或是使用快捷鍵 (mac: cmd + Enter,win: ctl + Enter) 執行者一段程式碼(如果你有用過 Jupyter Notebook,這裡的一段程式碼就是一個 block)。

Demo Query

右邊的 query 是一個簡單的教學,註解文字(# 為註解)中說明的很清楚,告訴你從創建 index(第 10 行)、寫一個 document 入這個 index(第14~19 行)、搜尋這個 index 的包含 rocky mountain 字詞的文件(第 23 行)等。這邊簡單說明一下:

  • 創建 index

    PUT /<index_name>
    

    沒錯就這麼簡單,好像沒什麼好說的。

    如果成功,會得到以下的回應

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "my-index"
    }
    
  • 寫入文件

    POST /<index_name>/_doc
    <document as json format>
    

    如果成功會得到以下回應

    {
      "_index": "my-index",
      "_id": "Ehw64JEBwHSv4ArTo1PU",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }
    

    範例提供的是寫入單一筆資料可以使用的 endpoint(_doc)。

    如果想要一次多筆,可以使用 _bulk endpoint,要特別注意的是這個 endpoint 得資料需要是 newline separate json,也就是不同的 doc 中要透過換行來區別,同一 document 內不能存在換行。

    POST /_bulk
    { "index" : { "_index" : "my-index" } }
    {"id": "es_add_single","title": "Add a single document","description": "Submit the following indexing request to add a single document to the books index. The request automatically creates the index."}
    ...
    { "index" : { "_index" : <index_name> } }
    <document_content_in_new_line_separate_format>
    

    如果成功,會得到以下的回應:

    {
      "errors": false,
      "took": 100635550,
      "items": [
        {
          "index": {
            "_index": "my-index",
            "_id": "Exyh4JEBwHSv4ArTl1PQ",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 1,
            "_primary_term": 1,
            "status": 201
          }
        },
        {
          "index": {
            "_index": "my-index",
            "_id": "FByh4JEBwHSv4ArTl1PQ",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 2,
            "_primary_term": 1,
            "status": 201
          }
        }
      ]
    }
    
  • 全文搜尋

    GET /my-index/_search?q="rocky-mountain"
    

    使用 _search api,並使用 q 參數指定搜尋的關鍵字;也可以使用 match query 搜尋特定的欄位,API request 如下:

    GET /my_index/_search
    {
      "query": {
        "match": {
          "title": "Add"
        }
      }
    }
    
    # query 說明
    # {
    #   "query": {
    #     "match": {
    #       "<要搜尋的欄位>": "<要搜尋的字>"
    #     }
    #   }
    # }
    
  • 看到這邊,刪除 document的方法應該不難猜到

    DELETE /my-index/_doc/<document_id> 
    

    如果成功會得到以下結果:

    {
      "_index": "my-index",
      "_id": "es_add_single",
      "_version": 1,
      "result": "not_found",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 4,
      "_primary_term": 1
    }
    

以上是透過 kibana console 簡單的資料 ingest、search、delete 示範,前面有提到,ES 的操作 RESTful 的 API,因此任何可以操作 API 的工具,都可以操作 elasticsearch。此外,ES 也有 python、JS、Ruby、GO 等 API 介面可以使用。

接下來會簡單說明在 insert document、search 時在 es 背後發生的事,包含被自動化判斷的 schema、文本 reverse-index 過程等。


上一篇
2024 鐵人賽 Day3: docker 安裝 elasticsearch + kibana
下一篇
2024 鐵人賽 Day5: Index Mapping
系列文
重新開始 elasticsearch 29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言